



import pandas as pd
import numpy as np

# 创建示例数据（含日期列和数值列）
data = {
    'date': ['2023-01-01 10:00', '2023-01-01 11:00', '2023-01-02 09:00', '2023-01-02 12:00'],
    'product': ['A', 'B', 'A', 'B'],
    'sales': [100, 150, 200, 300]
}
df = pd.DataFrame(data)

# 转换日期列为datetime类型
df['date'] = pd.to_datetime(df['date'])  # 关键步骤：确保时间格式统一[3,7](@ref)
df.set_index('date', inplace=True)  # 设为索引以便时间操作[3,6](@ref)
print(df)



# 按日统计销售总额
daily_sales = df['sales'].resample('D').sum()  # 'D'=按天 
print("每日销售额：\n", daily_sales)

# 按月统计均值（显示当月第一天）
monthly_mean = df['sales'].resample('MS').mean()  # 'MS'=月起始日 
print("\n月均销售额：\n", monthly_mean)


# 按产品分组 + 按月重采样求销售总和
result = (
    df.groupby('product')  # 先按产品分组
    .resample('M')['sales']  # 每组内按月重采样 
    .sum()
    .reset_index()
)
print("\n各产品月销售总额：\n", result)




# 按小时统计销售均值
df['hour'] = df.index.hour  # 提取小时 
hourly_avg = df.groupby('hour')['sales'].mean()
print("\n每小时平均销售额：\n", hourly_avg)

# 按年份和产品分组求最大值
annual_max = df.groupby([df.index.year, 'product'])['sales'].max()
print("\n分产品年度最高销售额：\n", annual_max)





# 生成连续时间序列数据
dates = pd.date_range('2023-01-01', periods=10, freq='D')
ts = pd.DataFrame({'sales': np.random.randint(50, 200, size=10)}, index=dates)

# 计算3天 ---- 滚动 ---- 平均
ts['rolling_avg'] = ts['sales'].rolling(window=3).mean()  # 窗口大小=3 
print("\n滚动平均：\n", ts)




# 优先用 pd.to_datetime() 统一格式，避免后续操作错误
# 频率代码: D（日）、W（周）、M（月）、Q（季）、H（小时）; 添加 S（如 MS）指定起始日    



# ---------------------------------------------------------------
# .dt 是 Pandas 中用于处理日期时间数据的核心接口（accessor），专为 datetime64 或 timedelta64 类型的 Series 设计。
# 它提供了一系列高效、向量化的方法，可快速提取、转换和分析时间信息
# .dt 本质是一个访问器（accessor），通过 pd.Series.dt 调用，仅适用于日期时间类型的 Series
# 使用 .dt 前需确保数据已转换为 Pandas 的日期时间类型
df['date_col'] = pd.to_datetime(df['date_col'])  # 字符串 → datetime64

# 与索引的区别
# 若日期列是 DataFrame 的索引，直接调用属性（如 df.index.year）
# 若日期列是普通列，必须通过 .dt 访问（如 df['date_col'].dt.year）

# 属性                     说明	                                  示例
# .year	              年份 (4位数)	                     df['date_col'].dt.year
# .month	               月份 (1-12)	                     df['date_col'].dt.month
# .day	              日期 (1-31)	                     df['date_col'].dt.day
# .hour	              小时 (0-23)	                      df['date_col'].dt.hour
# .minute	              分钟 (0-59)	                     df['date_col'].dt.minute
# .second	               秒数 (0-59)	                     df['date_col'].dt.second
# .dayofweek	         星期几 (0=周一)	                  df['date_col'].dt.dayofweek
# .dayofyear	         一年中的第几天	                     df['date_col'].dt.dayofyear
# .quarter	          季度 (1-4)	                    df['date_col'].dt.quarter

df['month'] = df['order_date'].dt.month



# .is_month_start	 是否当月第一天	      df['date_col'].dt.is_month_start
# .is_month_end	     是否当月最后一天	  df['date_col'].dt.is_month_end
# .is_quarter_start	 是否当季第一天	      df['date_col'].dt.is_quarter_start
# .is_leap_year	     是否闰年	         df['date_col'].dt.is_leap_year

end_of_month_data = df[df['date_col'].dt.is_month_end]
df['weekday_name'] = df['date_col'].dt.day_name()  # 返回英文名 (e.g., 'Monday')


# 重采样（Resample）结合 .dt 按时间维度聚合统计; 按季度统计销售总额  # Q: 季度
quarterly_sales = (df.set_index('date_col').resample('Q')['sales'].sum())
# 滑动窗口计算（Rolling）计算移动平均值
df['7d_avg'] = df['sales'].rolling(window='7D', on='date_col').mean()



df.set_index('timestamp').resample('1H').mean()  # 小时均值
df.rolling(window='7D').sum()  # 7天滚动和